import { SceneGame } from "../../SceneGame";

const { ccclass, property } = cc._decorator;

interface IUserInfo {
    user: IUser;
    header: IHeader;
}

interface IUser {
    token: string;
    uid: string;
    nickname: string;
    headimg: string;
    is_new: number;
}

interface IHeader {
    channel: string;
    version: string;
    versionName: string;
    package: string;
    currtime: string;
    system_version: string;
    manufacturer: string;
    emodel: string;
    packageName: string;
    uid: string;
    cityName: string;
}

interface ISendInfo {
    type: number;
    state?: string;
    adPosition?: string;
    money?: number;
    active_days?: number;
    cache_need_value?: number;
    cache_video_surplus?: number;
    index_x_num?: number;
    index_x_interval?: number;
}

@ccclass
export default class HttpManager {
    /** 客户端类名 */
    private static androidUrl: string = "org/cocos2dx/javascript/AppClient";
    /** 服务端路径 */
    private static serverUrl: string = "";
    /** 用户token */
    public static token: string = "591603abccfe45ebb31a784c0b999f126e4fb71ead1f4cf484347a3af2d2";

    /** 参数加密  */
    private static IsEncryption: boolean = false;

    /** 微信用户数据 */
    public static wxUserInfo: IUserInfo = null;

    public static callback: Function = null;

    /**
     * 关闭提现页面数据
     * @param isCloseToast 是否弹红包券提示?
     * @param cashValue 红包券金额
     */
    public static closeCashData: { isCloseToast: boolean, cashValue: number, upgradeId: number } = { isCloseToast: false, cashValue: 0, upgradeId: 0 };

    public static async setupUserInfo() {
        window["PostServer"] = this;

        const name = CC_JSB ? "vv" : "api_v2";
        this.serverUrl = `http://120.55.42.179/${name}/milkyTeaV2/`;

        this.getUserInfo();
    }

    /**
     * 与服务器通信
     * @param url 服务端口
     * @param params 参数  如果params为null, 传现在时间戳
     * @param callback 回调函数
     * @param isEncry 是否携带token
     */
    public static post(url: string, params: any, callback: Function, button: cc.Button = null, isEncry: boolean = true) {
        if (params === null) {
            params = { time: Date.now() };
        }

        if (button) {
            button.interactable = false;
        }

        const name = CC_JSB ? "vv" : "api_v2";
        let realUrl = this.serverUrl + url;
        // switch (url) {
        //     case "applyYuanBao": // 元宝提现时, 用花园的元宝提现
        //         realUrl = `http://120.55.42.179/${name}/new_garden/applyYuanBao`;
        //         break;
        //     case "/vv/user/cancel":
        //         realUrl = `http://120.55.42.179/${name}/user/cancel`;
        //         break;
        // }

        let token = "Bearer " + this.token;
        let xhr: XMLHttpRequest = new XMLHttpRequest();
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                if (button) {
                    button.interactable = true;
                }

                if ((xhr.status >= 200 && xhr.status < 400)) {
                    const response = xhr.responseText;
                    const result = JSON.parse(response);
                    if (result.code == 200) {
                        callback(null, result);
                    } else {
                        // 登录失效
                        switch (result.code) {
                            case 6: // 网络链接异常，请稍后再试
                                {
    
                                }
                                break;
                            case 401: // 登录失效
                                {
                                    // HttpManager.callAndroidMethod(EAndroidType.LoginFailure);
                                    console.log("code 401~");
                                }
                                break;
                        }
                        SceneGame.instance.showToast(cc.v2(0, 0), result.message);
                        callback(null, result);
                    }
                } else {
                    SceneGame.instance.showToast(cc.v2(0, 0), `errCode:${xhr.status}  网络异常, 请稍后再试~`);
                    callback(null, null);
                }
            }
        };
        xhr.open("POST", realUrl, true);
        xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        let sign = this.SignEncryption(params);
        xhr.setRequestHeader("sign", sign);
        xhr.setRequestHeader("Authorization", token);
        xhr.send(JSON.stringify(params));
    }

    /** md5加密 */
    private static SignEncryption(d) {
        let h = JSON.stringify(d);
        let b = window['md5'].prototype.hex_md5(this.token.substr(0, 6) + this.token.substr(0, 10));
        b = d == null ? b : h + b;
        let s = window['md5'].prototype.hex_md5(b);
        return s;
    }

    /** aes加密 */
    private static AESEncryption(data, isEncry: boolean) {
        data = JSON.stringify(data);
        if (this.IsEncryption == true && isEncry == true) {
            return data;
        }
        return data;
    }



    /***
     * 获取用户信息 is_new 0.老 1.新
     * @return {"user": {"token":"f03deb7b6a7148f4ac2b25a96417bd860289c9c22c3e31d3a82d86043c14",
     * "uid":"2 228","nickname":"用户名","headimg":"", is_new:1},"header": {"channel":"sgct","version":"1.0.1",
     * "versionName":"1.0.1","package":"com.hc.sgct ","currtime":1619147644569,
     * "system_version":"8.0.0","manufacturer":"HUAWEI","model":"VIE- AL10",
     * "packageName":"com.hc.sgct","uid":"2228","cityName":"%E5%8C%97%E4%BA%AC%E5 %B8%82"}}
     */
    public static getUserInfo() {
        // 通过 CC_JSB 来判断是否为 native 环境（模拟器）。
        // 通过 cc.sys.isMobile 来判断是否为手机环境。
        if (CC_JSB) {
            const userInfo = jsb.reflection.callStaticMethod(this.androidUrl, "getUserInfo", "()Ljava/lang/String;");
            this.wxUserInfo = JSON.parse(userInfo) as IUserInfo;
            this.token = this.wxUserInfo.user.token;
        }
    }

    // /**
    //  * 获取数美id、经度、纬度
    //  * @param cb 
    //  */
    // public static getShuMeiData(cb: Function) {
    //     if (CC_JSB) {
    //         this.callback = cb;
    //         const jsonParam = { type: EAndroidType.GetShuMei };
    //         jsb.reflection.callStaticMethod(this.androidUrl, "callAndroidMethod", "(Ljava/lang/String;)V", JSON.stringify(jsonParam));
    //     }
    // }

    // /**
    //  * 获取视频价格
    //  * @param cb 
    //  */
    // public static getVideoPirce(cb: Function) {
    //     if (CC_JSB) {
    //         this.callback = cb;
    //         const jsonParam = { type: EAndroidType.GetVideoPrice };
    //         jsb.reflection.callStaticMethod(this.androidUrl, "callAndroidMethod", "(Ljava/lang/String;)V", JSON.stringify(jsonParam));
    //     }
    // }

    // /**
    //  * 订单id回传 { type:19, order_id:10000, order_value:0.3 }
    //  * @param _Str JSON 类型
    //  */
    // public static orderIdBack(data: { type: EAndroidType, order_id: number, order_value: number }) {
    //     if (CC_JSB) {
    //         // console.log("HttpManager.orderIdBack()===>订单id回传:", JSON.stringify(data));
    //         const jsonParam = data;
    //         jsb.reflection.callStaticMethod(this.androidUrl, "callAndroidMethod", "(Ljava/lang/String;)V", JSON.stringify(jsonParam));
    //     }
    // }

    // /**
    //  * 上报埋点日志
    //  * @param event 上传类型
    //  */
    // public static reportBuriedPoint(eventType: EReportType | string, name: string) {
    //     const jsonParam = { type: EAndroidType.ReportPoint, eventID: eventType, label: name };
    //     if (!CC_JSB) {
    //         // console.log(`上报埋点:${JSON.stringify(jsonParam)}`);
    //         return;
    //     }
    //     jsb.reflection.callStaticMethod(this.androidUrl, "callAndroidMethod", "(Ljava/lang/String;)V", JSON.stringify(jsonParam));
    // }

    // public static callAndroidMethod(type: EAndroidType, param: any = null, cb: Function = null) {
    //     // // 通过 CC_JSB 来判断是否为 native 环境（模拟器）。
    //     // // 通过 cc.sys.isMobile 来判断是否为手机环境。
    //     // // cc.sys.platform === cc.sys.ANDROID
    //     // if (CC_JSB) {
    //     //     let jsonParam: ISendInfo = { type: type };
    //     //     switch (type) {
    //     //         case EAndroidType.PlayVideo:
    //     //             {
    //     //                 this.callback = cb;
    //     //                 jsonParam = { type: type, adPosition: `shipin-${param}` };
    //     //             }
    //     //             break;
    //     //         case EAndroidType.CloseIdRed:
    //     //             {
    //     //                 jsonParam = { type: type, state: "guanbi" };
    //     //             }
    //     //             break;
    //     //         case EAndroidType.InitYouMeng:
    //     //             {
    //     //                 const baseInfo = AppService.instance.getBaseInfo();
    //     //                 jsonParam = { type: type, index_x_num: baseInfo.index_x_num, index_x_interval: baseInfo.index_x_interval };
    //     //                 // console.log("HttpManage.callAndroidMethod()===>友盟初始化:", JSON.stringify(jsonParam));
    //     //             }
    //     //             break;
    //     //         case EAndroidType.CpmRedParam:
    //     //             {
    //     //                 // if (GlobalData.isCpmRedSend) {
    //     //                 //     return;
    //     //                 // }
    //     //                 // GlobalData.isCpmRedSend = true;
    //     //                 // const baseInfo = AppService.instance.getBaseInfo();
    //     //                 // const cpm = baseInfo.with_red_cpm;
    //     //                 // const surplus = baseInfo.with_red_surplus;
    //     //                 // jsonParam = { type: type, cache_video_surplus: surplus, cache_need_value: cpm };
    //     //             }
    //     //             break;
    //     //     }
    //     //     // console.log("HttpManage.callAndroidMethod()===>", JSON.stringify(jsonParam));
    //     //     jsb.reflection.callStaticMethod(this.androidUrl, "callAndroidMethod", "(Ljava/lang/String;)V", JSON.stringify(jsonParam));
    //     // } else {
    //     //     // console.log("HttpManage.callAndroidMethod(): 不是native环境~");
    //     // }
    // }

    /** 
     * 客户端回调cocos方法
     * @param jsonParam 参数 json格式字符串 
     * action参数：
     * 100激励视频 {"action":100,"result":1, "adId":11111} result 1播放成功，其他失败
     * 101绑定微信 {"action":101,"result":1} result 1绑定成功，其他失败
     * 102调整游戏弹窗位置 {"action":102,"sHeight":1920,"height":320} sHeight 屏幕高度，height大图高度
     * @return 
     */
    public static callCocosMethod(jsonParam: string) {
    //     if (CC_JSB) {
    //         // console.log("HttpManage.callCocosMethod()===>", jsonParam);

    //         const data: { action: number, result: number, adId: number, status: number, ad_id: number, bonus: number, price: number } = JSON.parse(jsonParam);
    //         switch (data.action) {
    //             case 100:
    //                 {
    //                     // if (data.result === 1) {
    //                     //     // adId
    //                     //     PlatManager.videoInfo.adId = `${data.adId}`;
    //                     //     // 存钱罐金额
    //                     //     GlobalData.addBankBonus(data.bonus);
    //                     //     Message.instance.send(EventID.PLAY_VIDEO_COMPLETE, PlatManager.videoInfo.name);

    //                     //     // 播放完成视频数增加
    //                     //     const baseInfo = AppService.instance.getBaseInfo();
    //                     //     baseInfo.video_num++;
    //                     // }
    //                     // this.callback && this.callback(data);
    //                     // this.callback = null;
    //                 }
    //                 break;
    //             case 101:
    //                 break;
    //             case 102:
    //                 {
    //                     const picData: { action: number, sHeight: number, height: number } = JSON.parse(jsonParam);
    //                     GlobalData.picture_ratio = picData.height / picData.sHeight;
    //                     const realHeight = GlobalData.stage_height * GlobalData.picture_ratio;
    //                     const errData: IPictureErrData = { sHeight: picData.sHeight, height: picData.height, realHeight: realHeight, realRatio: GlobalData.picture_ratio };
    //                     Message.instance.send(EventID.POP_VIEW_MOVE_UP, errData);
    //                     // console.log("HttpManage.callCocosMethod().大图===>", JSON.stringify(errData));
    //                 }
    //                 break;
    //             case 106: // 提现 获取数美ID、经纬度 
    //                 {
    //                     // this.callback && this.callback(data);
    //                     // this.callback = null;
    //                 }
    //                 break;
    //             case 112: // 展示高价id红包
    //                 // {
    //                 //     const panelLength = AppService.instance.getPopViewLength();
    //                 //     if (panelLength > 0) {
    //                 //         console.log("HttpManage.callCocosMethod()===>25存在其他弹窗~");
    //                 //         HttpManager.callAndroidMethod(EAndroidType.CloseIdRed);
    //                 //         return;
    //                 //     }

    //                 //     const baseData = AppService.instance.getBaseData();
    //                 //     if (baseData.game_level <= 10) {
    //                 //         console.log("HttpManage.callCocosMethod()===>25前十关不出红包~");
    //                 //         HttpManager.callAndroidMethod(EAndroidType.CloseIdRed);
    //                 //         return;
    //                 //     }

    //                 //     const guideData = AppService.instance.getGuideData();
    //                 //     if (guideData.isGuide || guideData.isMaterial || guideData.isTea) {
    //                 //         if (guideData.isGuide) {
    //                 //             console.log("HttpManage.callCocosMethod()===>25存在新手引导~");
    //                 //         }

    //                 //         if (guideData.isMaterial) {
    //                 //             console.log("HttpManage.callCocosMethod()===>25存在材料教学~");
    //                 //         }

    //                 //         if (guideData.isTea) {
    //                 //             console.log("HttpManage.callCocosMethod()===>25存在奶茶教学~");
    //                 //         }
    //                 //         HttpManager.callAndroidMethod(EAndroidType.CloseIdRed);
    //                 //         return;
    //                 //     }

    //                 //     if (GlobalData.envelopeInfo.type !== EEnvelopeType.Default) {
    //                 //         console.log("c存在红包弹窗, 继续cpm红包任务~");
    //                 //         HttpManager.callAndroidMethod(EAndroidType.CloseIdRed);
    //                 //         return;
    //                 //     }

    //                 //     HttpManager.redStateValue = 112;
    //                 //     GlobalData.envelopeInfo.type = EEnvelopeType.Hot;
    //                 //     SceneGame.instance.showPopView(EventID.SHOW_ENVELOPE_PANEL);
    //                 // }
    //                 break;
    //             case 115: // 展示cpm提现红包
    //                 // {
    //                 //     const panelLength = AppService.instance.getPopViewLength();
    //                 //     if (panelLength > 0) {
    //                 //         console.log("HttpManage.callCocosMethod()===>29存在其他弹窗~");
    //                 //         HttpManager.callAndroidMethod(EAndroidType.CpmOpenTask);
    //                 //         return;
    //                 //     }

    //                 //     const baseData = AppService.instance.getBaseData();
    //                 //     if (baseData.game_level <= 10) {
    //                 //         console.log("HttpManage.callCocosMethod()===>29前十关不出红包~");
    //                 //         HttpManager.callAndroidMethod(EAndroidType.CpmOpenTask);
    //                 //         return;
    //                 //     }

    //                 //     const guideData = AppService.instance.getGuideData();
    //                 //     if (guideData.isGuide || guideData.isMaterial || guideData.isTea) {
    //                 //         if (guideData.isGuide) {
    //                 //             console.log("HttpManage.callCocosMethod()===>29存在新手引导~");
    //                 //         }

    //                 //         if (guideData.isMaterial) {
    //                 //             console.log("HttpManage.callCocosMethod()===>29存在材料教学~");
    //                 //         }

    //                 //         if (guideData.isTea) {
    //                 //             console.log("HttpManage.callCocosMethod()===>25存在奶茶教学~");
    //                 //         }
    //                 //         HttpManager.callAndroidMethod(EAndroidType.CpmOpenTask);
    //                 //         return;
    //                 //     }

    //                 //     const baseInfo = AppService.instance.getBaseInfo();
    //                 //     if (baseInfo.with_red_surplus <= 0) {
    //                 //         console.log("HttpManage.callCocosMethod()===>29cpm红包次数不足~");
    //                 //         return;
    //                 //     }

    //                 //     if (GlobalData.envelopeInfo.type !== EEnvelopeType.Default) {
    //                 //         console.log("c存在红包弹窗, 继续cpm红包任务~");
    //                 //         HttpManager.callAndroidMethod(EAndroidType.CpmOpenTask);
    //                 //         return;
    //                 //     }

    //                 //     HttpManager.redStateValue = 115;
    //                 //     GlobalData.envelopeInfo.type = EEnvelopeType.Cash;
    //                 //     SceneGame.instance.showPopView(EventID.SHOW_ENVELOPE_PANEL);
    //                 // }
    //                 break;
    //             case 116: // cpm提现红包播放完成 视频完成回调 { action: 116, ad_id: "xxx", status: 1, bonus: 88 } 
    //                 {
    //                     // // console.log("HttpManage.callCocosMethod()===>cpm红包视频回调:", JSON.stringify(data));

    //                     // if (data.status === 1) {
    //                     //     // 存钱罐金额
    //                     //     GlobalData.addBankBonus(data.bonus);
    //                     //     Message.instance.send(EventID.PLAY_PRICE_COMPLETE, data.ad_id);
    //                     // } else {
    //                     //     SceneGame.instance.showToast(cc.v2(0, 0), "视频已失效~");
    //                     // }
    //                 }
    //                 break;
    //             case 117: // 客户端看视频返回存钱罐金额 { action: 117, bonus: 88 } 
    //                 {
    //                     // // 存钱罐金额
    //                     // GlobalData.addBankBonus(data.bonus, true);
    //                 }
    //                 break;
    //             case 118: // 客户端从提现页面原生返回
    //                 {
    //                     // if (GlobalData.recordViewData.node !== null) {
    //                     //     GlobalData.recordViewData.cb && GlobalData.recordViewData.cb();
    //                     // }
    //                 }
    //                 break;
    //             case 120:
    //                 {
    //                     // const value = Number(data.bonus);
    //                     // GameUtil.instance.changeResValue(EResType.Red, value);
    //                 }
    //                 break;
    //             case 130: // 视频价格
    //                 {
    //                     // const temp = { adId: data.adId, price: data.price };
    //                     // this.callback && this.callback(temp);
    //                     // this.callback = null;
    //                 }
    //                 break;
    //             case 135: // 客户端通知第一个请求到的视频
    //                 {
    //                     // console.log("===>客户端通知第一个请求到的视频");
                        
    //                     // const url = "setMergeFirstRequest";
    //                     // HttpManager.post(url, { ad_id: data.adId }, (err, result) => {
    //                     //     if (result) {
    //                     //         if (result.code === 200) {
    //                     //             const info = result.data as ITaskRuleInfo;
    //                     //             Message.instance.send(EventID.REFRESH_TASK_BAR, info);
    //                     //         }
    //                     //     }
    //                     // });
    //                 }
    //                 break;
    //         }
    //     }
    }
}